package capaPresentacion.client.presentador;

import capaPresentacion.client.WorldsTrainerWebServiceAsync;
import capaPresentacion.client.evento.EventoLogueoAdministrador;
import capaPresentacion.client.evento.EventoLogueoUsuario;
import capaPresentacion.shared.UsuarioDTO;
import capaPresentacion.shared.Verificador;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;

public class PresentadorLogueo implements Presentador {

	private final WorldsTrainerWebServiceAsync rpcService;
	private final HandlerManager eventBus;
	private final Display display;

	public interface Display {

		HasClickHandlers getBotonAceptar();

		HasValue<String> getNombreUsuario();

		HasValue<String> getContrasenya();

		HasClickHandlers getAceptarRegistrarse();

		HasValue<String> getNombre();

		HasValue<String> getApellidos();

		HasValue<String> getEmail();

		HasValue<String> getContrasenya1();

		HasValue<String> getContrasenya2();

		HasValue<String> getPeso();

		HasValue<String> getAltura();

		HasValue<String> getEdad();

		Widget asWidget();
	}

	public PresentadorLogueo(WorldsTrainerWebServiceAsync rpcService,
			HandlerManager eventBus, Display display) {
		this.rpcService = rpcService;
		this.eventBus = eventBus;
		this.display = display;
		bind();
	}

	@Override
	public void go(HasWidgets container) {
		container.clear();
		container.add(display.asWidget());
	}

	private void bind() {
		this.display.getBotonAceptar().addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent arg0) {
				doLoguearse();
			}
		});
		this.display.getAceptarRegistrarse().addClickHandler(
				new ClickHandler() {

					@Override
					public void onClick(ClickEvent event) {
						doRegistrarse();
					}
				});
	}

	protected void doLoguearse() {
		rpcService.loguearse(display.getNombreUsuario().getValue(), display
				.getContrasenya().getValue(), new AsyncCallback<String>() {

			@Override
			public void onSuccess(String tipo) {
				if (tipo.equals("normal"))
					eventBus.fireEvent(new EventoLogueoUsuario());
				else if (tipo.equals("administrador"))
					eventBus.fireEvent(new EventoLogueoAdministrador());
			}

			@Override
			public void onFailure(Throwable arg0) {
				Window.alert("Error logeandose");
			}
		});
	}

	private void doRegistrarse() {
		String email = display.getEmail().getValue();
		String contrasenya = display.getContrasenya1().getValue();
		String nombre = display.getNombre().getValue();
		String apellidos = display.getApellidos().getValue();
		String peso = display.getPeso().getValue();
		String altura = display.getAltura().getValue();
		String edad = display.getEdad().getValue();
		if (Verificador.esEmailValido(email)
				&& Verificador.esContrasenyaValida(contrasenya)
				&& Verificador.esNombreApellidoValido(nombre)
				&& Verificador.esNombreApellidoValido(apellidos)
				&& Verificador.esEdadValida(edad)
				&& Verificador.esAlturaValida(altura)
				&& Verificador.esPesoValido(peso)) {
			if (contrasenya.equals(display.getContrasenya2().getValue())) {
				rpcService.registrarse(
						new UsuarioDTO(email, nombre, apellidos, contrasenya,
								Integer.parseInt(edad), Float.parseFloat(peso),
								Integer.parseInt(altura)),
						new AsyncCallback<Void>() {

							@Override
							public void onFailure(Throwable caught) {
								try {
									throw caught;
								} catch (IllegalArgumentException e) {
									Window.alert("Error al registrarse");
								} catch (Throwable e) {
									Window.alert("Ya existe un usuario con ese email");
								}
							}

							@Override
							public void onSuccess(Void arg0) {
								eventBus.fireEvent(new EventoLogueoUsuario());
							}
						});
			} else
				Window.alert("Las contraseñas introducidas no son iguales");
		} else
			Window.alert("Valor no valido en alguno de los campos (Nombre, Apellidos: minimo 2 caracteres, Contraseña: minimo 3 caracteres)");
	}
}
